<?php
  function curl_multirequest($data, $options = array()) {
  
    // array of curl handles
    $curly = array();
    // data to be returned
    $result = array();
  
    // multi handle
    $mh = curl_multi_init();
  
    // loop through $data and create curl handles
    // then add them to the multi-handle
    foreach ($data as $id => $d) {
  
      $curly[$id] = curl_init();
  
      $url = (is_array($d) && !empty($d['url'])) ? $d['url'] : $d;
      curl_setopt($curly[$id], CURLOPT_URL,            $url);
      curl_setopt($curly[$id], CURLOPT_HEADER,         0);
      curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, 1);
  
      // post?
      if (is_array($d)) {
        if (!empty($d['post'])) {
          curl_setopt($curly[$id], CURLOPT_POST,       1);
          curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d['post']);
        }
      }
  
      // extra options?
      if (!empty($options)) {
        curl_setopt_array($curly[$id], $options);
      }
  
      curl_multi_add_handle($mh, $curly[$id]);
    }
  
    // execute the handles
    $running = null;
    do {
      usleep(250);
      curl_multi_exec($mh, $running);
    } while($running > 0);
  
    // get content and remove handles
    foreach($curly as $id => $c) {
      $result[$id] = curl_multi_getcontent($c);
      curl_multi_remove_handle($mh, $c);
    }
  
    // all done
    curl_multi_close($mh);
  
    return $result;
  }
